"""
@name : 2021-06-26-函数定义
@author : wenyao
@projectname: xsfh
"""
# def add(a,b):
#     print(f"两个数：{a},{b}")
#     return a+b
#
# result = add(1,2)
# result1 = add(3,4)
# print(result, result1)

#函数的参数
#可以不传递参数
# def  func1():
#     print("this is func1")
#
# func1()

#形参和实参

#通过形参分类（按照定义来分）
#必选参数/位置参数
#默认参数/关键字参数
#可变长位置参数
#可变长关键字参数

# def func1(name, age, sex):
#     print(f"my name is {name}; my age is {age}; sex is {sex}")
#
# func1("sc", 18, "f")
# func1("sc", "f",18)
#
# def func2(name, age, sex="f"):
#     print(f"my name is {name}; my age is {age}; sex is {sex}")
#
# func2("sc", 18, "m")
#
# #####对于实参调用
# func2("sc",sex="m", age=18)
#func2(sex = "m","sc", age=18)

#位置参数或者必选参数，必须放在关键字参数或者默认参数的前面

# 可变长位置参数
# def  myargs(*num):
#     # print(*num)
#     # print(type(num), num)
#     print(num[0])
# #1,2  ==> 元组 --》 num  == （1,2）
# myargs(1)
# myargs(1,2)
# myargs(1,2,3)

#可变长关键字参数
#**num  -- > a=1,b=2  --> {"a":1,"b":2}
# def myargs(**num):
#     print(num)
#     # print(**num)
# myargs(a=1,b=2,d=3)
# myargs(c=1,a=1)


#unpacking
# a = [1,2]
# #*a --> [1,2]  -->1,2
# print(*a)
# print(1,2)

# b = {"b1":1,"b2":2}
# #**b --> {"b1":1,"b2":2}  --> b1=1,b2=2
# print("b1 is {b1} , b2 is {b2}".format(b1=1,b2=2))
# print("b1 is {b1} , b2 is {b2}".format(**b))

######函数的return
#退出函数，并且返回结果
#函数中，代码一旦执行到return就退出，后面的语句不会执行
#如果没有return语句，默认返回None，如果return后面不接任何表达式，也返回None
#return返回多值

# def max_num(x,y):
#     print("return语句....")
#     if x > y:
#         print("return x")
#         return x
#     else:
#         print("return y")
#         return x-y,y
#     print("return ending.....")
#
# result = max_num(1,2)
# a,b = max_num(3,4)
# i,j = max_num(3,4)
# print(result)
# print(a,b)
# print(i,j)


####匿名函数
#不需要传递函数名
#函数体只能有一个表达式，不用写return，该表达式的结果就是返回值

# add = lambda x,y: x+y
# print(add(1,2))
# #
# add = lambda  x,y: x if x>y else y
# print(add(1,2))


######递归
#自己调用自己

# n! = 1*2*3*...n
# num = 1
# n=4
# for  i in range(1,n+1):
#     num *= i  #num = num*i
# print(num)

# n! = n * (n-1)!

# def func(n):
#     if n==1:
#         return 1
#     # print(n)
#     return n * func(n-1)
# print(func(3))

####
#每次递归都会保存结果在内存中，非常占用内存，并且效率低，能不用递归 尽量不要使用

#######函数的参数传递
#本质传递引用
#传递不可变数据类型
# def func1(x):
#     print(id(x))
#     x = 100
#     print(x)
# x = 1
# print(id(x))
# func1(x)
# print(x)

# 传递可变数据类型
# def f(x):
#     x[0] = 100
#     print(x)
#
# a = [1,2,3]
# f(a)
# print(a)

#参数定义时，尽量避免定义成一个可变对象
# def f(a=[]):
#     # a=[]
#     a.append(1)
#     print(a)
#
# f()
# f()
# f()

#####变量的作用域
#使用global关键字在函数内可以编辑一个全局变量
# x =4
# def f1():
#     global x
#     x = 5
#
# f1()
# print(x)

#######变量名的解析########
#LEGB原则
#local
#enclosing
#global
# #build-in
# def outer():
#     #__name__ = 5
#     def inner():
#         #__name__=4
#         # for i in range(10):
#         #     x = 500
#         #     print(id(x))
#         print(__name__)
#     inner()
# #__name__ = 6
# outer()
#
# ######文档注释#####
# def func1():
#     """
#
#     test func1
#     :param None
#     :return:
#     """
#     print("i am func1")
#
# print(help(func1))
# #
# print(dir(__builtins__))


# 1、a+=c，a=a+c区别是什么？
# 2、列表去重并从大到小排序？
# 3、如何在一个函数内部修改全局变量
# 4、如何跨模块共享全局变量
# 5、python数据类型有哪些
# 6、python中生成随机整数（1-10）、随机小数（1-10）， 0-1之间的方法
# 7、python中哪些是可变数据类型，哪些是不可变数类型
# 8、如何判断一个字符串是否是回文（从左至右，从右至左）都一样
# 9、将两个列表[11,-2,4,5,8]和[5,2,-10,0]合并成一个列表，并且从小到达排序
# 10、提取给定log日志里的ip和时间字段，将时间格式转化为“2021-07-16 10:00:00”此类型字符串